home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
macros
/
latex209
/
contrib
/
slatex
/
seqprocs.ss
< prev
next >
Wrap
Text File
|
1993-11-07
|
7KB
|
266 lines
;seqprocs.ss
;SLaTeX Version 1.99
;Sequence routines
;(c) Dorai Sitaram, December 1991, Rice University
'(enable schemetoc)
(define list?
(lambda (x)
;tests if x is a proper list;
;rnrs but not in scheme-to-c
(if (pair? x) (list? (cdr x)) (null? x))))
'(enable cl)
(define ormap some)
'(enable cscheme)
(define ormap (lambda (f l) (there-exists? l f)))
'(disable chez cl cscheme)
(define ormap
(lambda (f l)
;returns nonfalse iff f is true of at least one element in l;
;this nonfalse value is that given by the first such element in l;
;only one argument list supported
(let loop ((l l))
(if (null? l) #f
(or (f (car l)) (loop (cdr l)))))))
(define ormapcdr
(lambda (f l)
;returns the first cdr of l for which f is true;
;only one argument list supported
(let loop ((l l))
(if (null? l) #f
(or (f l) (loop (cdr l)))))))
'(enable cl)
(define append! nconc)
'(disable chez cl cscheme elk scmj)
(define append!
(lambda (l1 l2)
;destructively appends lists l1 and l2;
;only two argument lists supported
(cond ((null? l1) l2)
((null? l2) l1)
(else (let loop ((l1 l1))
(if (null? (cdr l1))
(set-cdr! l1 l2)
(loop (cdr l1))))
l1))))
'(enable cl)
(define append-map! mapcan)
'(disable cl cscheme)
(define append-map!
(lambda (f l)
;maps f on l but splices (destructively) the results;
;only one argument list supported
(let loop ((l l))
(if (null? l) '()
(append! (f (car l)) (loop (cdr l)))))))
'(enable cl)
(define rem! delete-if)
'(disable chez cl)
(define rem!
(lambda (? s)
;returns those elements of list s for which pred ? holds;
;s may be side-effected;
(let ((headed-s (cons 'void s)))
(let loop ((s s) (trail headed-s))
(if (null? s) (cdr headed-s)
(let ((a (car s)))
(if (? a)
(let ((d (cdr s)))
(set-cdr! trail d)
(loop d trail))
(loop (cdr s) s))))))))
'(enable cl)
(define reverse! nreverse)
'(disable chez cl cscheme elk)
(define reverse!
(lambda (s)
;reverses list s inplace (i.e., destructively)
(let loop ((s s) (r '()))
(if (null? s) r
(let ((d (cdr s)))
(set-cdr! s r)
(loop d s))))))
'(enable cl)
(define list-set! sequence-set!)
'(disable cl)
(define list-set!
(lambda (l i v)
;sets the i-th element of list l to v
(let loop ((l l) (i i))
(cond ((null? l) (lerror "list-set!: list too small"))
((= i 0) (set-car! l v))
(else (loop (cdr l) (- i 1)))))))
(define list-prefix?
(lambda (pfx l)
;tests if list pfx is a prefix of list l
(cond ((null? pfx) #t)
((null? l) #f)
((eqv? (car pfx) (car l)) (list-prefix? (cdr pfx) (cdr l)))
(else #f))))
(define string-prefix?
(lambda (pfx s)
;tests if string pfx is a prefix of string s
(let ((pfx-len (string-length pfx)) (s-len (string-length s)))
(if (> pfx-len s-len) #f
(let loop ((i 0))
(if (>= i pfx-len) #t
(and (char=? (string-ref pfx i) (string-ref s i))
(loop (+ i 1)))))))))
(define string-suffix?
(lambda (sfx s)
;tests if string sfx is a suffix of string s
(let ((sfx-len (string-length sfx)) (s-len (string-length s)))
(if (> sfx-len s-len) #f
(let loop ((i (- sfx-len 1)) (j (- s-len 1)))
(if (< i 0) #t
(and (char=? (string-ref sfx i) (string-ref s j))
(loop (- i 1) (- j 1)))))))))
(define member-string member)
'(enable cl)
(define adjoin-string
(lambda (s l)
(adjoin s l :test string=?)))
'(disable cl)
(define adjoin-string
(lambda (s l)
;adjoins string s to string-set l
(if (member-string s l) l
(cons s l))))
'(enable cl)
(define remove-string!
(lambda (s l)
(delete s l :test string=?)))
'(enable chez schemetoc)
(define remove-string! remove!)
'(disable chez cl schemetoc)
(define remove-string!
(lambda (s l)
;destructively removes string s from string-set l
(rem! (lambda (l_i) (string=? l_i s)) l)))
'(enable cl)
(define adjoin-char
(lambda (c l)
(adjoin c l :test char=?)))
'(disable cl)
(define adjoin-char
(lambda (c l)
;adjoins char c to a char-set l
(if (memv c l) l (cons c l))))
'(enable cl)
(define remove-char!
(lambda (c l)
(delete c l :test char=?)))
'(enable chez schemetoc)
(define remove-char! remv!)
'(disable chez cl schemetoc)
(define remove-char!
(lambda (c l)
;destructively removes char c from char-set l
(rem! (lambda (l_i) (char=? l_i c)) l)))
'(enable cl)
(define sublist subseq)
'(disable cl)
(define sublist
(lambda (l i f)
;finds the sublist of l from index i inclusive to index f exclusive
(let loop ((l (list-tail l i)) (k i) (r '()))
(cond ((>= k f) (reverse! r))
((null? l) (lerror 'sublist))
(else (loop (cdr l) (+ k 1) (cons (car l) r)))))))
'(enable cl)
(define position-char position)
'(disable cl)
(define position-char
(lambda (c l)
;finds the leftmost index of character-list l where character c occurs
(let loop ((l l) (i 0))
(cond ((null? l) #f)
((char=? (car l) c) i)
(else (loop (cdr l) (+ i 1)))))))
'(enable cl)
(define string-position-right
(lambda (c s)
(position c s :test char=? :from-end #t)))
'(disable cl)
(define string-position-right
(lambda (c s)
;finds the rightmost index of string s where character c occurs
(let ((n (string-length s)))
(let loop ((i (- n 1)))
(cond ((< i 0) #f)
((char=? (string-ref s i) c) i)
(else (loop (- i 1))))))))
(define token=?
(lambda (t1 t2)
;tests if t1 and t2 are identical tokens
((if *slatex-case-sensitive?* string=? string-ci=?) t1 t2)))
'(enable cl)
(define assoc-token
(lambda (x s)
(lisp:assoc x s :test token=?)))
'(disable cl)
(define assoc-token
(lambda (x s)
;finds cell corresponding to token x in alist s
(ormap (lambda (s_i) (if (token=? (car s_i) x) s_i #f)) s)))
'(enable cl)
(define member-token
(lambda (x s)
(lisp:member x s :test token=?)))
'(disable cl)
(define member-token
(lambda (x s)
;finds tail of list s starting with token x
(ormapcdr (lambda (s_i..) (if (token=? (car s_i..) x) s_i.. #f))
s)))
'(enable cl)
(define remove-token!
(lambda (x s)
(delete x s :test token=?)))
'(disable cl)
(define remove-token!
(lambda (x s)
;removes token x destructively from token-list s
(rem! (lambda (s_i) (token=? s_i x)) s)))